// 📁 service/FineService.java (完整修复版)
package com.library.management.service;

import com.library.management.entity.Fine;
import com.library.management.entity.User;
import com.library.management.enums.FineReason;
import com.library.management.enums.FineStatus;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 罚款服务接口
 * 处理罚款相关的业务逻辑
 */
public interface FineService extends BaseService<Fine, Long> {

    /**
     * 根据用户查找罚款记录
     */
    List<Fine> findByUser(User user);

    /**
     * 根据用户ID查找罚款记录
     */
    List<Fine> findByUserId(Long userId);

    /**
     * 根据罚款状态查找记录
     */
    List<Fine> findByStatus(FineStatus status);

    /**
     * 根据罚款原因查找记录
     */
    List<Fine> findByFineReason(FineReason reason);

    /**
     * 查找未支付的罚款记录
     */
    List<Fine> findUnpaidFines();

    /**
     * 查找部分支付的罚款记录
     */
    List<Fine> findPartialPaidFines();

    /**
     * 查找已支付的罚款记录
     */
    List<Fine> findPaidFines();

    /**
     * 查找已减免的罚款记录
     */
    List<Fine> findWaivedFines();

    /**
     * 统计用户的罚款总金额
     */
    BigDecimal sumFineAmountByUserId(Long userId);

    /**
     * 统计用户的未支付罚款金额
     */
    BigDecimal sumUnpaidFineAmountByUserId(Long userId);

    /**
     * 支付罚款
     */
    Fine payFine(Long fineId, BigDecimal amount, String paymentMethod);

    /**
     * 减免罚款（管理员操作）
     */
    Fine waiveFine(Long fineId, String reason);

    /**
     * 创建逾期罚款
     */
    Fine createOverdueFine(Long borrowRecordId, BigDecimal fineRate);

    /**
     * 创建遗失罚款
     */
    Fine createLostFine(Long borrowRecordId, BigDecimal bookPrice);

    /**
     * 创建损坏罚款
     */
    Fine createDamagedFine(Long borrowRecordId, BigDecimal damageAmount, String description);

    /**
     * 查找逾期未支付的罚款记录
     */
    List<Fine> findOverdueFines(int expiryDays);

    /**
     * 统计各状态的罚款数量
     */
    List<Object[]> countFinesByStatus();

    /**
     * 根据借阅记录ID查找罚款记录
     */
    Optional<Fine> findByBorrowRecordId(Long borrowRecordId);

    /**
     * 统计指定天数内的罚款总额
     */
    BigDecimal sumFineAmountByPeriod(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 检查罚款是否已完全支付
     */
    boolean isFineFullyPaid(Long fineId);

    /**
     * 获取待支付金额
     */
    BigDecimal getRemainingAmount(Long fineId);

    /**
     * 批量处理过期罚款
     */
    void processExpiredFines(int expiryDays);
}